package ar.com.siglo21.algoritmos.controller;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import ar.com.siglo21.algoritmos.exception.ListaEnlazadaDobleException;
import ar.com.siglo21.algoritmos.model.DatoNodo;
import ar.com.siglo21.algoritmos.model.ListaDoblementeEnlazada;
import ar.com.siglo21.algoritmos.model.ListaEnlazadaDobleIter;
import ar.com.siglo21.algoritmos.model.ListaEnlazadaDobleIterOrd;
import ar.com.siglo21.algoritmos.model.ListaIteradora;
import com.google.common.io.Files;

public class AppController {

	private static final String EXTENSION_PDF = "pdf";

	private static final String EXTENSION_DOC = "doc";

	private static final String EXTENSION_TXT = "txt";

	private static final String EXTENSION_PNG = "png";

	private static final String EXTENSION_BMP = "bmp";

	private static final String EXTENSION_JPG = "jpg";

	private static final String PUNTO = ".";

	private static final String NOMBRE_ARCHIVO_REPORTE_DOCUMENTOS = "documentos";

	private static final String NOMBRE_ARCHIVO_REPORTE_IMAGENES = "reporteImagenes";

	private int cantidadArchivosJPG;

	private int cantidadArchivosBMP;

	private int cantidadArchivosPNG;

	private FileManager fileManager = new DefaultFileManager();

	private List<DatoNodo> listaDeCarpetas;

	private ListaIteradora listaEnlazadaDeImagenes = new ListaEnlazadaDobleIter(
			new ListaDoblementeEnlazada());
	private ListaEnlazadaDobleIter listaEnlazadaDeDocumentosAscendente = new ListaEnlazadaDobleIterOrd(
			new ListaDoblementeEnlazada());
	private ListaEnlazadaDobleIter listaEnlazadaDeDocumentosDescendente = new ListaEnlazadaDobleIterOrd(
			new ListaDoblementeEnlazada());

	private FileWriter fw;

	public void generarListas(String pathLocation)
			throws ListaEnlazadaDobleException {

		File rootDir = fileManager.createFileFromStringPath(pathLocation);
		listaDeCarpetas = new ArrayList<DatoNodo>();
		DatoNodo datoNodo;

		for (File f : Files.fileTreeTraverser().preOrderTraversal(rootDir)) {
			if (!f.isDirectory()) {

				switch (getFileExtension(f).toLowerCase()) {
				case EXTENSION_JPG:
					datoNodo = new DatoNodo(f.getName(), getFileExtension(f),
							f.getAbsolutePath(), false);
					listaEnlazadaDeImagenes.insertar(datoNodo);
					cantidadArchivosJPG++;
					break;

				case EXTENSION_BMP:
					datoNodo = new DatoNodo(f.getName(), getFileExtension(f),
							f.getAbsolutePath(), false);
					listaEnlazadaDeImagenes.insertar(datoNodo);
					cantidadArchivosBMP++;
					break;

				case EXTENSION_PNG:
					datoNodo = new DatoNodo(f.getName(), getFileExtension(f),
							f.getAbsolutePath(), false);
					listaEnlazadaDeImagenes.insertar(datoNodo);
					cantidadArchivosPNG++;
					break;

				case EXTENSION_TXT:
					datoNodo = new DatoNodo(f.getName(), getFileExtension(f),
							f.getAbsolutePath(), false);
					listaEnlazadaDeDocumentosAscendente
							.insertarAscendente(datoNodo);
					listaEnlazadaDeDocumentosDescendente
							.insertarDescendente(datoNodo);
					break;

				case EXTENSION_DOC:
					datoNodo = new DatoNodo(f.getName(), getFileExtension(f),
							f.getAbsolutePath(), false);
					listaEnlazadaDeDocumentosAscendente
							.insertarAscendente(datoNodo);
					listaEnlazadaDeDocumentosDescendente
							.insertarDescendente(datoNodo);
					break;

				case EXTENSION_PDF:
					datoNodo = new DatoNodo(f.getName(), getFileExtension(f),
							f.getAbsolutePath(), false);
					listaEnlazadaDeDocumentosAscendente
							.insertarAscendente(datoNodo);
					listaEnlazadaDeDocumentosDescendente
							.insertarDescendente(datoNodo);
					break;
				}

			} else {
				datoNodo = new DatoNodo(f.getName(), null, f.getAbsolutePath(),
						true);
				listaDeCarpetas.add(datoNodo);
			}
		}
	}

	public void generarReporteDeDocumentos(String pathLocation)
			throws ListaEnlazadaDobleException {

		String documentos = listaEnlazadaDeDocumentosDescendente
				.imprimirDocumentos();
		String[] documentosSplit = documentos.split("-");

		try {
			fw = new FileWriter(String.format("%s\\%s%s%s", pathLocation,
					NOMBRE_ARCHIVO_REPORTE_DOCUMENTOS, PUNTO, EXTENSION_TXT));

			for (String string : documentosSplit) {
				fw.write("\n" + string);
			}
			fw.close();

		} catch (IOException e) {
			throw new ListaEnlazadaDobleException(
					"Error al escribir el reporte de Documentos");
		}

	}

	private String getFileExtension(File f) {
		return Files.getFileExtension(f.toString());
	}

	public void generarReporteDeImagenes(String pathLocation)
			throws ListaEnlazadaDobleException {
		try {
			fw = new FileWriter(String.format("%s\\%s%s%s", pathLocation,
					NOMBRE_ARCHIVO_REPORTE_IMAGENES, PUNTO, EXTENSION_TXT));

			fw.write("Cantidad de directorios Analizados: "
					+ listaDeCarpetas.size());
			fw.write("\nCantidad de fotos JPG encontradas: "
					+ cantidadArchivosJPG);
			fw.write("\nCantidad de fotos BMP encontradas: "
					+ cantidadArchivosBMP);
			fw.write("\nCantidad de fotos PNG encontradas: "
					+ cantidadArchivosPNG);
			fw.write("\nCantidad total de fotos encontradas: "
					+ (cantidadArchivosPNG + cantidadArchivosBMP + cantidadArchivosJPG));
			fw.close();
		} catch (IOException e) {
			throw new ListaEnlazadaDobleException(
					"Error al escribir el reporte de Imagenes");
		}

	}
}
